<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>方法返回值为子类对象1</title>
</head>
<body>
<script>
  class Product {
    constructor(id =1,price =20) {
      this.id = id
      this.price = price
    }

    increasePrice(price){

      /*
      * 之前这样写那么子类调用这个方法只能返回子类对象
      * 可以类似于java中抽象方法那样操作 这里不固定调用子类的构造方法，而是调用原型上的方法
      * 这个方法默认是返回当前调用者的构造方法的 子类在继承后可重写返回的逻辑 类似于java中的多态
      *
      * 当然JS中其实没有严格的多态,高阶函数就是一种多态
      *
      * */
      // let newProduct = new this.constructor(this.id,this.price)

      /*这里可以直接new Product*/
      let newProduct = new this.constructor[Symbol.species]
      newProduct.price = price
      return newProduct
    }

   static get [Symbol.species](){
      return this.prototype.constructor
    }
  }

  class MyProduct extends Product{
    getMyProduct(){
      console.log("getMyProduct");
    }

    static get [Symbol.species](){
      return Product
    }
  }

  let product = new Product(100,200)
  console.log(product.increasePrice(120));

  console.log("---");

  let myProduct = new MyProduct();
  console.log(myProduct);
  let newMyProduct = myProduct.increasePrice(100);
  console.log(newMyProduct instanceof MyProduct);
  console.log(newMyProduct);
  newMyProduct.getMyProduct()
</script>
</body>
</html>